// 构造器重载和函数重载使用基本相同，主要区别是：TS类构造器重载签名和实现签名都不要管理返回值(也没有返回值)，TS构造器是在对象创建出来之后还没有赋值给对象变量之前执行，一般采用给对象属性赋值

// 构造器是在对象创建的整个过程中被使用到的，当对象创建完成后就不会使用到，构造器可以说成是构造函数，但是不能看做是方法

// ts 和es6 的class 中的this  当new 一个对象时，构造器会隐式返回this 给对象等号左边的对象变量，this 和等号左边的对象都指向当前创建正在创建的对象  类会隐式返回this,如果要说 类有返回值那也只能是this

/**
 * 需求
 * 计算宽高
 * 实现方式 传入二个实参可以计算，传入 一个对象可以计算
 * 
 */


type TypeSummation= {
  width?:number;
  height?:number;
}

class summation {

  public width;
  public height;
  constructor(width: number, height: number)
  constructor(ParamObje_:TypeSummation)
  // constructor(summationObj:any,height_?:number){ // 因为这个height_ 上面是构造器重载是必填参数 所以这里不建议使用可选参数
  constructor(ParamObje_Obj_:any,height_=0){
    if(typeof ParamObje_Obj_ === "object"){
      const {width,height} = ParamObje_Obj_;

      this.width = width;
      this.height = height;
    }else{
      this.width=ParamObje_Obj_;
      this.height = height_;
    }
  }

  sunArea():number{
    return this.width*this.height
  }


}

const sun = new summation(40,50);

console.log(sun.sunArea());

const obj:TypeSummation={width:10,height:20}

console.log(new summation(obj).sunArea());
